/**
 * @file mem.h
 * @brief Gestionnaire de mémoire
 * @author Radim BADSI, Kévin CHAPON, Fanny FERLET
 */

#ifndef MEM_H
#define MEM_H

/**
 * Type de pile.
 */
typedef enum {ELEMENTS=0, CLAUSES=1, VARIABLES=2} t_pile;

/**
 * Initialise le support du multithreading.
 */
void init_mem_threading();

/**
 * Retourne le nombre d'allocations internes.
 * @return nombre d'allocations internes.
 */
int nombre_alloc (void);

/**
 * Retourne le nombre de mallocs.
 * @return nombre de mallocs.
 */
int nombre_malloc (void);

/**
 * Alloue une zone mémoire.
 * @param taille Taille de la zone à allouer.
 * @param type_pile Type de zone mémoire.
 * @return pointeur vers la zone allouée.
 */
void* allouer (int taille, t_pile type_pile);

/**
 * Libère une zone mémoire.
 * @param ptr pointeur vers la zone à libérer.
 * @param type_pile Type de zone mémoire.
 */
void restituer (void* ptr, t_pile type_pile);

/**
 * Libère plusieurs zones mémoire.
 * @param ptr_elements pointeur vers la zone à libérer.
 * @param ptr_clauses pointeur vers la zone à libérer.
 * @param ptr_variables pointeur vers la zone à libérer.
 */
void restituer_tout (void* ptr_elements, void* ptr_clauses, void* ptr_variables);
#endif
